package com.bookrecomm.controller;

import com.bookrecomm.service.FavoriteService;
import com.bookrecomm.vo.BookVO;
import com.bookrecomm.vo.PageVO;
import com.bookrecomm.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

/**
 * 收藏控制器
 * 处理用户收藏相关的请求
 */
@RestController
@RequestMapping("/favorites")
public class FavoriteController {

    @Autowired
    private FavoriteService favoriteService;

    /**
     * 添加收藏（需要登录）
     * @param bookId 图书ID
     * @return 添加结果
     */
    @PostMapping("/{bookId}")
    @PreAuthorize("isAuthenticated()")
    public ResultVO<Boolean> addFavorite(@PathVariable Long bookId) {
        boolean success = favoriteService.addFavorite(null, bookId);
        return ResultVO.success("收藏成功", success);
    }

    /**
     * 取消收藏（需要登录）
     * @param bookId 图书ID
     * @return 取消结果
     */
    @DeleteMapping("/{bookId}")
    @PreAuthorize("isAuthenticated()")
    public ResultVO<Boolean> removeFavorite(@PathVariable Long bookId) {
        boolean success = favoriteService.removeFavorite(null, bookId);
        return ResultVO.success("取消收藏成功", success);
    }

    /**
     * 检查是否已收藏（需要登录）
     * @param bookId 图书ID
     * @return 是否已收藏
     */
    @GetMapping("/check/{bookId}")
    @PreAuthorize("isAuthenticated()")
    public ResultVO<Boolean> isFavorite(@PathVariable Long bookId) {
        boolean isFavorite = favoriteService.isFavorite(null, bookId);
        return ResultVO.success("查询成功", isFavorite);
    }

    /**
     * 获取当前用户收藏的图书列表（需要登录）
     * @param page 页码（从1开始）
     * @param size 每页大小
     * @return 分页图书列表
     */
    @GetMapping("/me")
    @PreAuthorize("isAuthenticated()")
    public ResultVO<PageVO<BookVO>> getMyFavorites(
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "10") int size) {
        
        // 创建分页参数
        Pageable pageable = PageRequest.of(page - 1, size, Sort.by(Sort.Direction.DESC, "createdAt"));
        
        // 查询收藏列表
        PageVO<BookVO> pageVO = favoriteService.getUserFavorites(null, pageable);
        return ResultVO.success("获取成功", pageVO);
    }

    /**
     * 获取指定用户收藏的图书列表
     * @param userId 用户ID
     * @param page 页码（从1开始）
     * @param size 每页大小
     * @return 分页图书列表
     */
    @GetMapping("/user/{userId}")
    public ResultVO<PageVO<BookVO>> getUserFavorites(
            @PathVariable Long userId,
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "10") int size) {
        
        // 创建分页参数
        Pageable pageable = PageRequest.of(page - 1, size, Sort.by(Sort.Direction.DESC, "createdAt"));
        
        // 查询收藏列表
        PageVO<BookVO> pageVO = favoriteService.getUserFavorites(userId, pageable);
        return ResultVO.success("获取成功", pageVO);
    }

    /**
     * 获取用户收藏数量
     * @param userId 用户ID
     * @return 收藏数量
     */
    @GetMapping("/count/user/{userId}")
    public ResultVO<Long> countUserFavorites(@PathVariable Long userId) {
        Long count = favoriteService.countUserFavorites(userId);
        return ResultVO.success("获取成功", count);
    }

    /**
     * 获取图书被收藏数量
     * @param bookId 图书ID
     * @return 被收藏数量
     */
    @GetMapping("/count/book/{bookId}")
    public ResultVO<Long> countBookFavorites(@PathVariable Long bookId) {
        Long count = favoriteService.countBookFavorites(bookId);
        return ResultVO.success("获取成功", count);
    }
}
